home *** CD-ROM | disk | FTP | other *** search
-
- /*******************************************************************************
- * The Elm Mail System - $Revision: 5.1 $ $State: Exp $
- *
- * Copyright (c) 1992 USENET Community Trust
- *******************************************************************************
- * Bug reports, patches, comments, suggestions should be sent to:
- *
- * Syd Weinstein, Elm Coordinator
- * elm@DSI.COM dsinc!elm
- *
- *******************************************************************************
- * $Log: putenv.c,v $
- * Revision 5.1 1992/10/03 22:41:36 syd
- * Initial checkin as of 2.4 Release at PL0
- *
- *
- ******************************************************************************/
-
- /*
- * This code was stolen from cnews. Modified to make "newenv" static so
- * that realloc() can be used on subsequent calls to avoid memory leaks.
- *
- * We only need this if Configure said there isn't a putenv() in libc.
- */
-
- /* peculiar return values */
- #define WORKED 0
- #define FAILED 1
- #define NO 0
- #define YES 1
- #ifndef NULL
- #define NULL (0)
- #endif
-
- int putenv(char *var) /* put var in the environment */
- {
- register char **envp;
- register int oldenvcnt;
- static char **newenv = NULL;
- extern char **environ;
-
- /* count variables, look for var */
- for (envp = environ; *envp != 0; envp++) {
- register char *varp = var, *ep = *envp;
- register int namesame;
-
- namesame = NO;
- for (; *varp == *ep && *varp != '\0'; ++ep, ++varp)
- if (*varp == '=')
- namesame = YES;
- if (*varp == *ep && *ep == '\0')
- return WORKED; /* old & new var's are the same */
- if (namesame) {
- *envp = var; /* replace var with new value */
- return WORKED;
- }
- }
- oldenvcnt = envp - environ;
-
- /* allocate new environment with room for one more variable */
- if (newenv == NULL)
- newenv = (char **)malloc((unsigned)((oldenvcnt+1+1)*sizeof(*envp)));
- else
- newenv = (char **)realloc((char *)newenv, (unsigned)((oldenvcnt+1+1)*sizeof(*envp)));
- if (newenv == NULL)
- return FAILED;
-
- /* copy old environment pointers, add var, switch environments */
- (void) bcopy((char *)environ, (char *)newenv, oldenvcnt*sizeof(*envp));
- newenv[oldenvcnt] = var;
- newenv[oldenvcnt+1] = NULL;
- environ = newenv;
- return WORKED;
- }
-
-